package com.edu.flying_birds;

import javax.imageio.ImageIO;
import javax.lang.model.element.VariableElement;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

/**
 * @PackageName: com.edu.flying_birds
 * @ClassName: BirdPanel
 * @Description: 游戏面板
 * @author: RZS
 * @date: 2021/6/16  15:23
 */
public class BirdPanel extends JPanel {

    // 声明一个存放背景图片的变量
    private BufferedImage bg;
    // 声明地面变量
    private Ground ground;
    // 声明柱子1变量
    private Column column1;
    // 声明柱子2变量
    private Column column2;
    // 声明小鸟变量
    private Bird bird;
    // 定义游戏准备状态, 未运行 false，运行  true
    private boolean start = false;
    // 定义游戏结束状态, 未结束  false，结束  true
    private boolean gameOver = false;
    // 定义定时器对象
    public Timer timer;
    // 定义积分变量
    public int score;

    public BirdPanel() {
        try {
            init();
            // 添加鼠标监听器
            MouseAdapter mouseAdapter = new MouseAdapter() {
                // 鼠标点击方法
                @Override
                public void mouseClicked(MouseEvent e) {
                    // 判断游戏是否运行
                    if(start){
                        // 判断游戏是否结束
                        if(gameOver){
                            // 游戏结束，调用init()方法初始化游戏
                            try {

                                // 初始化游戏
                                init();
                                start = false;
                                gameOver = false;
                                // 停止/清理定时器
                                timer.cancel();
                            } catch (IOException ex) {
                                ex.printStackTrace();
                            }
                        }

                        // 判断小鸟是否到达顶部
                        if(bird.y <= 0){
                            // 不让小鸟继续向上飞，或者直接让小鸟挂掉
                        }else{
                            // 调用小鸟往上运动的方法
                            bird.moveUp();
                        }
                    }else{
                        // 修改游戏状态
                        start = true;
                        // 调用执行方法  run()
                        run();
                    }
                }
            };
            // 添加鼠标监听对象
            this.addMouseListener(mouseAdapter);

        } catch (IOException e) {
            System.out.println("初始化面板失败");
            e.printStackTrace();
        }



    }

    private void init() throws IOException {
        // 设置面板的背景颜色
        setBackground(Color.black);
        // 初始化背景图片变量
        bg = ImgUtils.getImg("../img/bg.png");
        // 初始化地面变量
        ground = new Ground();
        // 初始化柱子1
        column1 = new Column(1);
        // 初始化柱子2
        column2 = new Column(2);
        // 初始化小鸟变量
        bird = new Bird();
        // 初始化分数
        score = 0;
    }

    /**
     * 让面板中的对象动起来
     */
    public void run(){
        /**
         * 利用定时器来调用对象的运动方法
         */
        timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                // 判断游戏结束状态
                if(!gameOver && start) {
                    // 让地面移动
                    ground.move();
                    // 让柱子1动起来
                    column1.move();
                    // 让柱子2动起来
                    column2.move();
                    // 让小鸟翅膀动起来
                    bird.flying();
                    // 判断小鸟与第一根柱子是否相撞
                    boolean c1 = bird.pillar(column1);
                    // 判断小鸟与第二根柱子是否相撞
                    boolean c2 = bird.pillar(column2);

                    // 调用判断小鸟与地面相撞的方法
                    if(bird.strike() || c1 || c2){
                        // 小鸟掉地上了
                        gameOver = true;
                    }else{
                        // 调用方法，让小鸟下落
                        bird.moveDown();
                    }

                    // 计分
                    if((column1.x+column1.width == bird.x) || (column2.x+column2.width == bird.x)){
                        score++;
                    }

                }


                // 刷新面板
                repaint();
            }
        };
        // 启动定时器
        timer.schedule(timerTask, 0, 30);
    }

    /**
     * 重写paint方法
     * @param g 画笔
     */
    @Override
    public void paint(Graphics g) {
        // 绘制背景图片
        g.drawImage(bg, 0, 0, null);
        // 绘制柱子1图片
        g.drawImage(column1.img, column1.x, column1.y, column1.width, column1.height, null);
        // 绘制柱子2图片
        g.drawImage(column2.img, column2.x, column2.y, column2.width, column2.height, null);
        // 绘制小鸟图片
        g.drawImage(bird.img, bird.x, bird.y, bird.width, bird.height, null);
        // 绘制游戏准备界面
        if(!start){
            try {
                g.drawImage(ImgUtils.getImg("../img/start.png"), 0, 0, null);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 绘制游戏结束页面
        if(gameOver){
            try {
                g.drawImage(ImgUtils.getImg("../img/gameover.png"), 0, 0, null);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // 绘制地面图片
        g.setColor(Color.white);
        g.setFont(new Font("黑体", Font.BOLD, 20));
        // 绘制分数
        g.drawString("分数："+score, 15, 30);


        g.drawImage(ground.img, ground.x, ground.y, null);


    }


}
